import { isObject } from "../utils";

// 检测数据变化  类有类型  知道是谁的实例
class Observe {
  constructor(data) {//对对象中所有属性进行劫持
    this.walk(data)
  }
  walk (data) {
    //不会遍历原型链 值遍历对象自身私有的属性
    Object.keys(data).forEach((key) => {
      defineReactive(data, key, data[key])
    })
  }
}
// vue2会对对象进行遍历 用defineProperty 让当中的每个数据变成响应式  导致性能不高
function defineReactive (data, key, value) {
  // value 有可能是对象  递归
  observe(value)
  Object.defineProperty(data, key, {
    get () {
      return value
    },
    set (newVal) {
      // 用户赋值一个对象
      observe(newVal)
      value = newVal
    }
  })
}
export function observe (data) {
  // 如果是对象才观测、
  if (isObject(data)) {
    return;
  }
  // 默认最外层的data是对象
  return new Observe(data)
}